package logica;

import dao.DAOVocabulario;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import logica.util.TratamientoCadena;
import negocio.busqueda.BusquedaDocumento;
import negocio.busqueda.BusquedaVocabulario;
import negocio.Posteo;

public class Buscador {
  
    public static List<BusquedaDocumento> buscar(String consulta) {
        String consultaLimpia = TratamientoCadena.tratarTextoBusqueda(consulta);
        List<BusquedaVocabulario> palabrasBusqueda = DAOVocabulario.obtenerConsultaBusquedaOrdenadaPorNr(consultaLimpia);

        Hashtable<String, BusquedaDocumento> hashTemporal = new Hashtable<String, BusquedaDocumento>();

        List<BusquedaDocumento> resultadosBusqueda = new ArrayList<BusquedaDocumento>();
        
        for (BusquedaVocabulario busquedaVocabulario : palabrasBusqueda) {
            for (Posteo posteo : busquedaVocabulario.getVocabulario().getListaPosteo()) {
                if (hashTemporal.containsKey(posteo.getDocumento().getUrl())) {
                    BusquedaDocumento busquedaDocumentoGuardada = hashTemporal.get(posteo.getDocumento().getUrl());

                    short pesoIndividual = 0;
                    if (busquedaVocabulario.isExacto()) {
                        pesoIndividual = BusquedaDocumento.PESO_EXACTO;
                    } else if (busquedaVocabulario.isSubString()) {
                        pesoIndividual = BusquedaDocumento.PESO_SUBSTRING;
                    }

                    short pesoSumar = (short)(posteo.getFrecuencia() * pesoIndividual);
                    short nuevoPeso = (short)(busquedaDocumentoGuardada.getPeso() + pesoSumar);
                    busquedaDocumentoGuardada.setPeso(nuevoPeso);
                    busquedaDocumentoGuardada.addBusquedaVocabularioEnLista(busquedaVocabulario);
                    hashTemporal.put(posteo.getDocumento().getUrl(), busquedaDocumentoGuardada);
                } else {
                    BusquedaDocumento busquedaDocumento = new BusquedaDocumento();
                    busquedaDocumento.setDocumento(posteo.getDocumento());

                    short pesoIndividual = 0;
                    if (busquedaVocabulario.isExacto()) {
                        pesoIndividual = BusquedaDocumento.PESO_EXACTO;
                    } else if (busquedaVocabulario.isSubString()) {
                        pesoIndividual = BusquedaDocumento.PESO_SUBSTRING;
                    }

                    short pesoSumar = (short)(posteo.getFrecuencia() * pesoIndividual);
                    busquedaDocumento.setPeso(pesoSumar);

                    busquedaDocumento.addBusquedaVocabularioEnLista(busquedaVocabulario);
                    resultadosBusqueda.add(busquedaDocumento);
                    hashTemporal.put(posteo.getDocumento().getUrl(), busquedaDocumento);
                }
            }
        }
        Collections.sort(resultadosBusqueda);
        Collections.reverse(resultadosBusqueda);

        return resultadosBusqueda;
    }
}